package com.example.demo.controller;

import com.example.demo.entity.Student;
import com.example.demo.service.StudentService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping("/search")
    public ResponseEntity<Map<String, Object>> searchStudents(
            @RequestParam(required = false) String searchField,
            @RequestParam(required = false) String searchValue) {

        // 定义一个列表用于存放查询结果
        List<Student> students;

        if (searchField != null && !searchField.isEmpty() && searchValue != null && !searchValue.isEmpty()) {
            switch (searchField) {
                case "1": // 学号
                    try {
                        Long studentId = Long.parseLong(searchValue);
                        Optional<Student> optionalStudent = studentService.findById(studentId);
                        students = optionalStudent.isPresent() ? List.of(formatStudent(optionalStudent.get(), "jobNum")) : List.of();  // 学号查询时返回完整信息
                    } catch (NumberFormatException e) {
                        students = List.of();  // 如果学号无法解析为 Long，则返回空列表
                    }
                    break;

                case "2": // 身份证号
                    students = studentService.findByIdCard(searchValue).stream()
                            .map(student -> formatStudent(student, "2"))  // 身份证号查询时返回完整身份证号，银行卡号隐藏中间部分
                            .collect(Collectors.toList());
                    break;

                case "3": // 银行卡号
                    students = studentService.findByBankCard(searchValue).stream()
                            .map(student -> formatStudent(student, "3"))  // 银行卡号查询时返回完整银行卡号，身份证号隐藏中间部分
                            .collect(Collectors.toList());
                    break;

                default:
                    students = studentService.findAll(); // 没有指定条件时查询所有学生
                    break;
            }
        } else {
            students = studentService.findAll(); // 没有搜索条件时返回所有学生
        }

        // 对查询结果进行格式化（学号默认显示，身份证号和银行卡号根据查询条件隐藏）
        students = students.stream()
                .map(student -> formatStudent(student, searchField))
                .collect(Collectors.toList());

        // 准备响应数据
        Map<String, Object> response = new HashMap<>();
        response.put("students", students);
        response.put("totalItems", students.size()); // 返回符合条件的总条数

        return ResponseEntity.ok(response);
    }

    // 格式化学生信息：学号默认显示完整，身份证号和银行卡号根据查询条件显示
    private Student formatStudent(Student student, String searchField) {
        if ("2".equals(searchField)) {
            // 如果是身份证号查询，身份证号显示完整，银行卡号隐藏
            student.setBankCard(formatBankCard(student.getBankCard()));  // 银行卡号隐藏
        } else if ("3".equals(searchField)) {
            // 如果是银行卡号查询，银行卡号显示完整，身份证号隐藏
            student.setIdCard(formatIdCard(student.getIdCard()));  // 身份证号隐藏
        } else {
            // 如果查询的是学号或无条件查询，不做格式化，身份证号和银行卡号都格式化
            student.setIdCard(formatIdCard(student.getIdCard()));
            student.setBankCard(formatBankCard(student.getBankCard()));
        }
        return student;
    }

    // 格式化身份证号：显示前6位和后4位，中间部分用 * 替代
    private String formatIdCard(String idCard) {
        if (idCard != null && idCard.length() == 18) {
            return idCard.substring(0, 6) + "********" + idCard.substring(14);
        }
        return idCard;  // 如果身份证号无效，不做处理
    }

    // 格式化银行卡号：显示前6位和后4位，中间部分用 * 替代
    private String formatBankCard(String bankCard) {
        if (bankCard != null && bankCard.length() >= 10) {
            return bankCard.substring(0, 6) + "********" + bankCard.substring(bankCard.length() - 4);
        }
        return bankCard;  // 如果银行卡号无效，不做处理
    }
}







